const {
	isEmpty,
	isNotEmpty
} = require("../utils/index")

function isEmptyId(checkData, errMsg = 'id不能为空') {
	if (!checkData || checkData == '0' || checkData == 'null' || checkData == 'undefined' || checkData == '')
		return errMsg;
}

function isNotEmptyId(checkData, errMsg = 'id不能非空') {
	if (isEmpty(checkData)) return errMsg;
}

// 校验是否非空
function isNotEmptyValue(checkData, errorMsg = '不能为空') {
	if (isEmpty(checkData)) return errorMsg;
}
// 校验是否为空
function isEmptyValue(checkData, errorMsg = '不能非空') {
	if (isNotEmpty(checkData)) return errorMsg
}
// 校验是否为 null
function isNull(checkData, errorMsg = '数据为空') {
	if (isEmpty(checkData, true)) return errorMsg;
}
/** 校验是否是string */
function isString(checkData, errorMsg = '非字符串') {
	if (typeof checkData == 'string') return errorMsg;
}
/** 校验是否是数字 */
function isNumber(checkData, errorMsg = '非数字') {
	const regex = /^[0-9]+.?[0-9]*$/;
	if (!regex.test(checkData)) return errorMsg
}
/** 校验是否是英文字符 */
function isENChar(checkData, errorMsg = '非英文字符') {
	const regex = /^[A-Za-z]+$/;
	if (!regex.test(checkData)) return errorMsg;
}
/** 校验密码安全 */ // 字符开头 字符+数字+下划线 6 - 18位
function isSafePassword(checkData, errorMsg = '密码不安全') {
	// /^\w+$/ 数字、字符、下划线 
	const regex = /^[a-zA-Z]\w{5,17}$/
	if (!regex.test(checkData)) return errorMsg;
}
/** 校验数据最小长度 */
function minLength(checkData, length = 0, errorMsg = '超出最小长度') {
	if (checkData.length < length) return errorMsg;
}
/** 校验数据最大长度 */
function maxLength(checkData, length, errorMsg = '超出最大长度') {
	if (checkData.length > length) return errorMsg;
}
// 校验座机
function isLandLine(checkData, errorMsg = '错误的座机号码') {
	const regex = /^(\d{3,4}-)?\d{7,8}$/
	if (!regex.test(checkData)) return errorMsg;
}
// 校验手机
function isMobile(checkData, errorMsg = '错误的手机号码') {
	const regex = /^1[3|4|5|6|7|8|9][0-9]{9}$/;
	if (!regex.test(checkData)) return errorMsg;
}
// 校验身份证
function isIDCard(checkData, errorMsg = '错误的身份证') {
	if (!checkData) return errorMsg
	// prettier-ignore
	const provinceCodes = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37',
		'41', '42', '43', '44', '45', '46', '50', '51', '52', '53', '54', '61', '62', '63', '64', '65', '71', '81',
		'82', '91'
	]
	const reg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)?$/i
	const codeLen = checkData.length

	// 格式错误
	if (!reg.test(checkData) || ![15, 18].includes(codeLen)) {
		return errorMsg
	}

	// 地址码错误
	const provinceCode = checkData.substring(0, 2)
	if (!provinceCodes.includes(provinceCode)) {
		return errorMsg
	}

	// 18 位需校验最后一位校验码
	if (codeLen === 18) {
		const codeArr = checkData.split('')
		const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
		const parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
		let sum = 0
		let ai = 0
		let wi = 0
		for (let i = 0; i < 17; i++) {
			ai = codeArr[i]
			wi = factor[i]
			sum += ai * wi
		}
		if (parity[sum % 11] != codeArr[17].toUpperCase()) {
			// 校验码错误
			return errorMsg
		}
	}
}

// 校验是否为 true
function isTrue(checkData, errorMsg = "不能为false") {
	if (!checkData) return errorMsg;
}

// 校验是否为 false
function isFalse(checkData, errorMsg = "不能为True") {
	if (checkData) return errorMsg;
}

module.exports = {
	isEmptyId,
	isNotEmptyId,
	isNotEmptyValue,
	isEmptyValue,
	isNull,
	isString,
	isNumber,
	isENChar,
	isSafePassword,
	minLength,
	maxLength,
	isLandLine,
	isMobile,
	isIDCard,
	isTrue,
	isFalse
}